package oa.solr;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.stereotype.Component;

@Component
public class SolrManager {

    //设置solr服务器的路径，默认是使用第一个collection库，所以路径最后可以不加collection1
    private String baseURL = "http://localhost:8983/collection1";
    //如果要使用第二个collection库，那么就使用下面的链接
    //String baseURL2 = "http://localhost:8080/solr/collection2";
    //创建服务器连接对象
    private HttpSolrServer httpSolrServer = null;

    public SolrManager() {
        httpSolrServer = new HttpSolrServer(baseURL);
    }

    /**
     * 添加文档数据到solr服务器中
     * @throws Exception
     */
    public void addContent() throws Exception{
        //创建新的文档对象
        SolrInputDocument solrInputDocument = new SolrInputDocument();
        //设置文档的域
        solrInputDocument.setField("id", "64");
        solrInputDocument.setField("address", "河北 石家庄 酒店");
        solrInputDocument.setField("hotelname", "石家庄七天连锁酒店");
        //进行添加
        httpSolrServer.add(solrInputDocument);
        //进行手动提交，否则无法进行添加
        httpSolrServer.commit();
    }

    /**
     * 修改文档内容
     * 修改其实和添加是一样的，因为只要添加的ID是一样的，那么就会把原来的删除了，然后再添加一个
     * @throws IOException
     * @throws SolrServerException
     */
    public void updateContent() throws SolrServerException, IOException{
        //创建新的文档对象
        SolrInputDocument solrInputDocument = new SolrInputDocument();
        //设置文档的域
        solrInputDocument.setField("id", "64");
        solrInputDocument.setField("address", "河北 保定 酒店");
        solrInputDocument.setField("hotelname", "保定七天连锁酒店");
        httpSolrServer.add(solrInputDocument);
        //进行手动提交，否则无法进行添加
        httpSolrServer.commit();
    }

    /**
     * 进行删除文档操作
     * @throws SolrServerException
     * @throws IOException
     */
    public void deleteContent() throws Exception{
        //删除全部，第一个参数是设置需要删除的数据的域和值，第二个是执行后多久进行删除操作
        //httpSolrServer.deleteByQuery("*:*",1000);
        //删除某个特定域的特定值的数据
        httpSolrServer.deleteByQuery("id:64",1000);
    }

    /**
     * 查询数据（多功能的显示处理）
     * @throws Exception
     */
    public void queryContent() throws Exception{
        //创建查询数据对象（便于设置查询条件）
        SolrQuery solrQuery = new SolrQuery();
        //设置查询的域和值，这个在之后的项目中可以用于动态
        //方法一：参数q就代表query查询
        //solrQuery.set("q","address:保定");
        //方法二：(一般使用该方法)
        solrQuery.setQuery("address:保定");
        //方法三：通过设置默认域
        //solrQuery.set("df", "address");
        //solrQuery.setQuery("保定");

        //设置查询过滤条件(可以设置多个，只要域和值有改变就可以了)
        //solrQuery.set("fq", "id:haha123");

        //添加排序方式（可选内容）
        //solrQuery.addSort("需要排序的域",ORDER.asc);//升序
        //solrQuery.addSort("需要排序的域",ORDER.desc);//降序

        //设置分页处理(比如这是设置每次显示5个)
        solrQuery.setStart(0);
        solrQuery.setRows(5);

        //设置只查询显示指定的域和值(第二个参数可以是多个，之间用“逗号”分割)
        //solrQuery.set("fl", "name");

        //设置某域进行高亮显示
        solrQuery.setHighlight(true);
        solrQuery.addHighlightField("address");
        //设置高亮显示格式的前后缀
        solrQuery.setHighlightSimplePre("<span style='color:red'>");
        solrQuery.setHighlightSimplePost("</span>");

        //执行查询，获得查询结果对象
        QueryResponse query = httpSolrServer.query(solrQuery);
        //获取查询的结果集
        SolrDocumentList results = query.getResults();
        //获取高亮显示的查询结果
        //注意点：因为高亮的结果和正常的查询结果是不一样的，所以要进行特别的处理
        Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();
        //遍历结果集
        for (SolrDocument solrDocument : results) {
            String idStr = (String) solrDocument.get("id");
            System.out.println("id----------------" + idStr);
            String nameStr = (String) solrDocument.get("address");
            System.out.println("name----------------" + nameStr);
            System.out.println("===========高亮显示=====================");
            Map<String, List<String>> map = highlighting.get(idStr);
            List<String> list = map.get("address");
            String resultString = list.get(0);
            System.out.println("高亮结果为：-----" + resultString);
        }
    }

    public static void main(String[] args) throws Exception {
        SolrManager solrManager = new SolrManager();
        //solrManager.addContent();
        //solrManager.updateContent();
        //solrManager.deleteContent();
        //solrManager.queryContent();
    }
}
